﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data.SqlClient;

namespace PuanSunucusu
{
    public class Hareket
    {
        public int ID { get; set; }
        public double FisTutari { get; set; }
        public double Puan { get; set; }
        public string CariKodu { get; set; }
    }

    public class Senkronizasyon
    {
        List<PuanTanim> Tanimlar = new List<PuanTanim>();
        List<Cari> AnlikCariler;

        private string GetConnectionString(BaglantiTipleri tip)
        {
            string serverName = "";
            string databaseName = "";
            string auth = "";
            string username = "";
            string password = "";

            switch (tip)
            {
                case BaglantiTipleri.Mikro:
                    serverName = Program.Session[Settings.MikroServerName].ToString();
                    databaseName = Program.Session[Settings.MikroDatabaseName].ToString();
                    auth = Program.Session[Settings.MikroAuthenticateMode].ToString();
                    username = Program.Session[Settings.MikroUserName].ToString();
                    password = Program.Session[Settings.MikroPassword].ToString();
                    break;
                case BaglantiTipleri.Inter:
                    serverName = Program.Session[Settings.InterServerName].ToString();
                    databaseName = Program.Session[Settings.InterDatabaseName].ToString();
                    auth = Program.Session[Settings.InterAuthenticateMode].ToString();
                    username = Program.Session[Settings.InterUserName].ToString();
                    password = Program.Session[Settings.InterPassword].ToString();
                    break;
            }

            SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
            sqlBuilder.DataSource = serverName;
            sqlBuilder.InitialCatalog = databaseName;
            sqlBuilder.MultipleActiveResultSets = true;
            if (auth == "Sql")
            {
                sqlBuilder.UserID = username;
                sqlBuilder.Password = password;
                sqlBuilder.IntegratedSecurity = false;
            }
            else
                sqlBuilder.IntegratedSecurity = true;

            return sqlBuilder.ToString();
        }

        public void CariAktar()
        {
            try
            {
                using (PromoEntities ent = new PromoEntities())
                {
                    List<Cari> yenicariler = ArkaOfisCariListele(ent.Cariler.Select(x => x.ID).ToArray());
                    foreach (Cari cr in yenicariler)
                    {
                        ent.AddToCariler(cr);
                    }
                    ent.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message + "\r\n" + GetConnectionString(BaglantiTipleri.Mikro));
            }
        }

        private PuanTanim AktifTanim(string cariKodu, int odemeTipi)
        {
            //11*-12*-25*=38*
            //CARI.DAT’ DA KAYITLI OLAN VE CARIKODU 11 VE 12 İLE 
            //BAŞLAYAN VEYA CARIKODLARININ BAŞLANGICI 25 DEN BÜYÜK 
            //EŞİT VE 38DEN  KÜÇÜK EŞİT OLANLAR

            PuanTanim tanim = null;
            foreach (var item in Tanimlar.Where(x => x.OdemeTipi == 3 || x.OdemeTipi == odemeTipi))
            {
                if (item.MusteriAraligi == "")
                {
                    tanim = item;
                    break;
                }
                else
                {
                    if (item.MusteriAraligi == cariKodu) //tek cari için tanımlanmışsa
                    {
                        tanim = item;
                        break;
                    }
                    else //filtre uygulanmışsa
                    {
                        string[] filtreler = item.MusteriAraligi.Split('-');
                        if (filtreler.Length > 0)
                        {
                            foreach (string filtre in filtreler)
                            {
                                if (filtre.IndexOf('=') > -1)
                                {
                                    string[] tmp1 = filtre.Replace("=", "").Split('*');
                                    int c1 = Cevir.Parse<int>(cariKodu.Mid(0, tmp1[0].Length));
                                    int c2 = Cevir.Parse<int>(cariKodu.Mid(0, tmp1[1].Length));
                                    if (c1 >= Cevir.Parse<int>(tmp1[0]) && c2 <= Cevir.Parse<int>(tmp1[1]))
                                    {
                                        tanim = item;
                                        break;
                                    }
                                }
                                else if (filtre.IndexOf('*') > -1)
                                {
                                    string tmp2 = filtre.Replace("*", "");
                                    if (cariKodu.Mid(0, tmp2.Length) == tmp2)
                                    {
                                        tanim = item;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return tanim;
        }



        private Cari Find(string kodu)
        {
            Cari cr = null;
            if (AnlikCariler != null)
            {
                cr = AnlikCariler.Where(x => x.Kodu == kodu).FirstOrDefault();
                if (cr == null)
                {
                    CariYukle();
                    cr = AnlikCariler.Where(x => x.Kodu == kodu).FirstOrDefault();
                }
            }
            else
            {
                CariYukle();
                cr = AnlikCariler.Where(x => x.Kodu == kodu).FirstOrDefault();
            }
            return cr;
        }

        private void CariYukle()
        {
            using (PromoEntities ent = new PromoEntities())
            {
                AnlikCariler = ent.Cariler.ToList();
            }
        }

        public void HareketPuanVer()
        {
            try
            {
                using (PromoEntities ent = new PromoEntities())
                {
                    List<Hareket> hr = InterEklenenPuanHareketleri();
                    foreach (Hareket item in hr)
                    {
                        Cari cr = Find(item.CariKodu);
                        if (cr != null)
                        {
                            if (!string.IsNullOrEmpty(cr.AnaCariKodu))
                            {
                                PuanVer(cr.AnaCariKodu, item.Puan / 100 * cr.AnaCariPuanOrani, item.FisTutari / 100 * cr.AnaCariPuanOrani, ent);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message + "\r\n" + GetConnectionString(BaglantiTipleri.Mikro));
            }
        }

        private void PuanVer(string cariKod, double Puan, double OdemeTutari, PromoEntities ent)
        {
            BonusPuan bns = ent.BonusPuanlar.Where(x => x.Cari_Kod == cariKod).FirstOrDefault();
            if (bns != null)
            {
                bns.Puan += Cevir.Parse<decimal>(Puan);
                bns.KrediBakiyesi = 0;
                bns.KrediLimiti = 0;
                bns.RiskBakiyesi = 0;
                bns.RiskLimiti = 0;
                bns.ToplamTutar += Cevir.Parse<decimal>(OdemeTutari);
            }
            else
            {
                bns = new BonusPuan();
                bns.Puan = Cevir.Parse<decimal>(Puan);
                bns.Cari_Kod = cariKod;
                bns.KrediBakiyesi = 0;
                bns.KrediLimiti = 0;
                bns.RiskBakiyesi = 0;
                bns.RiskLimiti = 0;
                bns.ToplamTutar = Cevir.Parse<decimal>(OdemeTutari);
                ent.AddToBonusPuanlar(bns);
            }
        }

        private List<Cari> ArkaOfisCariListele(int[] mevcutCariler)
        {
            List<Cari> sonuc = new List<Cari>();
            using (SqlConnection cn = new SqlConnection(GetConnectionString(BaglantiTipleri.Mikro)))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT cari_RECno, cari_kod, cari_unvan1, cari_unvan2, cari_Ana_cari_kodu, cari_HalKomYuzdesi FROM CARI_HESAPLAR WITH (NOLOCK) WHERE (cari_lastup_date >= DATEADD(dd, -100, GETDATE()))", cn))
                {
                    cmd.CommandTimeout = 999999;
                    SqlDataReader rd = cmd.ExecuteReader();
                    Cari cari;
                    while (rd.Read())
                    {
                        int id = Cevir.Parse<int>(rd[0]);
                        if (mevcutCariler.Where(x => x == id).Count() == 0)
                        {
                            cari = new Cari();
                            cari.ID = Cevir.Parse<int>(rd[0]);
                            cari.Kodu = Cevir.Parse<string>(rd[1]);
                            cari.Adi = Cevir.Parse<string>(rd[2]);
                            cari.AnaCariKodu = Cevir.Parse<string>(rd[3]);
                            cari.AnaCariPuanOrani = Cevir.Parse<double>(rd[4]);
                            sonuc.Add(cari);
                        }
                    }
                    rd.Close();
                }
                cn.Close();
            }
            return sonuc;
        }

        private List<Hareket> InterEklenenPuanHareketleri()
        {
            List<Hareket> sonuc = new List<Hareket>();
            using (PromoEntities ent = new PromoEntities())
            {
                int baslangicID = 0;
                Kontrol k = ent.Kontroller.FirstOrDefault();
                if (k != null)
                {
                    baslangicID = k.InterPosSonHarID;
                }

                using (SqlConnection cn = new SqlConnection(GetConnectionString(BaglantiTipleri.Inter)))
                {
                    cn.Open();
                    using (SqlCommand cmd = new SqlCommand("SELECT        ID,Cari_Kod, Puan, ToplamTutar  FROM            INTERBONUS_PUANHAREKET WHERE        (ID > @id)", cn))
                    {
                        cmd.Parameters.Add("@id", System.Data.SqlDbType.Int).Value = baslangicID;
                        cmd.CommandTimeout = 999999;
                        SqlDataReader rd = cmd.ExecuteReader();
                        Hareket hr;
                        while (rd.Read())
                        {
                            hr = new Hareket();
                            hr.ID = Cevir.Parse<int>(rd[0]);
                            hr.CariKodu = Cevir.Parse<string>(rd[1]);
                            hr.Puan = Cevir.Parse<double>(rd[2]);
                            hr.FisTutari = Cevir.Parse<double>(rd[3]);
                            sonuc.Add(hr);
                        }
                        rd.Close();
                    }
                    cn.Close();
                }

                if (k != null && sonuc.Count > 0)
                {
                    k.InterPosSonHarID = sonuc.OrderByDescending(x => x.ID).Select(x => x.ID).FirstOrDefault();
                    ent.SaveChanges();
                }
                else
                {
                    if (sonuc.Count > 0)
                    {
                        k = new Kontrol();
                        k.InterPosSonHarID = sonuc.OrderByDescending(x => x.ID).Select(x => x.ID).FirstOrDefault();
                        k.MikroSonHarID = 0;
                        ent.AddToKontroller(k);
                        ent.SaveChanges();
                    }
                }
            }
            return sonuc;
        }
    }
}
